#include "oled.hpp"

#include "app.hpp"


// #define BIG_TEXT_FONT   u8g2_font_spleen8x16_mr
// #define SMALL_TEXT_FONT u8g2_font_spleen5x8_mr
// #define CHS_FONT u8g2_font_wqy12_t_chinese1


U8Type u8g2{U8G2_R0, OLED_CS_PIN_NUM, OLED_DC_PIN_NUM, U8X8_PIN_NONE};


void init_oled() {
    u8g2.begin();
    // SPI
    u8g2.setBusClock(F_CPU / 2);  // 设置SPI总线时钟为6MHz
    u8g2.setFont(SMALL_TEXT_FONT);
}


void clear_box(u8g2_int_t x, u8g2_int_t y, u8g2_int_t w, u8g2_int_t h) {
    u8g2.setDrawColor(0);  // 反色
    u8g2.drawBox(x, y, w, h);
    u8g2.setDrawColor(1);
}


void begin_msg() {
    u8g2.setCursor(30, 63);
    clear_box(30, 56, 45, 8);
    u8g2.setFont(SMALL_TEXT_FONT);  // 设置小字体
}


void end_msg() {
    u8g2.setDrawColor(1);  // 恢复正常颜色
}


void show_ask(const char* msg) {
    u8g2.setFont(BIG_TEXT_FONT);
    clear_box(104, 0, 27, 16);
    if (msg != nullptr) {
        u8g2.setCursor(104, 13);
        u8g2.print(msg);
    }
}


/**
 * @brief 用小字体在屏幕底部显示消息
 *
 * 所以显示函数默认只在full buffer 模式下可用
 *
 * @param msg
 */
void show_msg(const char* msg) {
    if (msg == nullptr) {
        msg = "NULL";  // 如果消息为空，显示默认消息
    }

    begin_msg();
    u8g2.print(msg);
    end_msg();
}


void show_meters(uint16_t m, uint16_t mm) {
    u8g2.print(m);
    u8g2.print('.');
    if(mm < 100) {
        u8g2.print('0');
    }
    if(mm  < 10) {
        u8g2.print('0');
    }
    u8g2.print(mm);
    u8g2.print(" m");
}


/**
 * @brief 在屏幕顶部显示测量值
 *
 * @param count
 */
void show_count(uint32_t count, char mark, const char* alt) {
    clear_box(0, 0, 85, 16);
    u8g2.setCursor(5, 13);
    u8g2.setFont(BIG_TEXT_FONT);  // 设置大字体

    u8g2.print(mark);
    u8g2.print(" ");

    if (count > 65535 && alt == nullptr) {
        alt = "OL";
    }


    if (alt != nullptr) {
        char buf[9];
        memset(buf, ' ', sizeof(buf) - 1);  // 清空缓冲区，留一个字节给'\0'
        buf[sizeof(buf) - 1] = '\0';        // 确保字符串以'\0'结尾
        auto len = strlen(alt);
        if (len > 6) {
            len = 6;  // 限制最大长度为6
        }

        auto offset = (sizeof(buf) - 1 - len) / 2;  // 居中显示
        memcpy(buf + offset, alt, len);

        u8g2.setDrawColor(0);  // 反色
        u8g2.print(buf);
        u8g2.setDrawColor(1);
    }
    else {
        uint16_t meters = count / 1000;        // 假设计数器每1000个计数表示1米
        uint16_t milli_meters = count % 1000;  // 余数表示毫米
        show_meters(meters, milli_meters);
    }
}


void show_response_time(uint32_t time_ms) {
    clear_box(90, 57, 37, 8);
    u8g2.setCursor(90, 63);
    u8g2.setFont(u8g2_font_spleen5x8_mr);  // 设置小字体
    u8g2.print("T ");
    u8g2.print(time_ms);
}


void show_slave_address(uint8_t slave) {
    u8g2.setCursor(5, 63);
    u8g2.setFont(u8g2_font_spleen5x8_mr);  // 设置小字体
    u8g2.print("#");
    u8g2.setCursor(12, 63);
    u8g2.print(slave);
}


void draw_left_arrow() {
    u8g2.drawTriangle(-1, 32, 4, 24, 4, 40);
}


void draw_right_arrow() {
    u8g2.drawTriangle(127, 32, 123, 24, 123, 40);
}


void draw_up_arrow(int16_t x, int16_t y) {
    u8g2.drawTriangle(x, y, x - 10, y + 5, x + 10, y + 5);
}


void draw_down_arrow(int16_t x, int16_t y) {
    u8g2.drawTriangle(x, y, x - 8, y - 4, x + 8, y - 4);
}


void draw_mode(const char* str) {
    draw_up_arrow(110, 17);
    draw_down_arrow(110, 47);

    u8g2.setFont(CHS_FONT);
    u8g2.drawUTF8(98, 37, str);
}


void draw_chs_menu_label(uint8_t line, const char* str, bool highlight) {
}


void draw_menu_item(uint8_t line, const char* str) {
}


void draw_menu_item(uint16_t line, uint16_t num, bool is_hex = false) {
}
